package com.smart.community.property.controller;

import com.smart.community.commons.result.Result;
import com.smart.community.commons.utils.SecurityUtils;
import com.smart.community.property.service.IPropertyCompanyStatisticsService;
import com.smart.community.property.service.DataScopeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import com.smart.community.commons.annotation.ApiLog;
import com.smart.community.commons.enums.ApiLogOperationType;

/**
 * 物业公司统计控制器
 * 提供物业公司相关统计数据的REST API接口
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 2.0.0 - 生产环境高标准优化，新增仪表盘综合统计接口
 */
@Slf4j
@RestController
@RequestMapping("/property/statistics")
@RequiredArgsConstructor
@Tag(name = "物业公司统计", description = "物业公司统计数据相关接口")
public class PropertyCompanyStatisticsController {

    private final IPropertyCompanyStatisticsService propertyCompanyStatisticsService;
    private final DataScopeService dataScopeService;

    /**
     * 获取物业公司总服务面积
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 总服务面积
     */
    @GetMapping("/area/{propertyCompanyId}")
    @Operation(summary = "获取物业公司总服务面积", description = "根据物业公司ID获取总服务面积")
    public Result<BigDecimal> getTotalServiceArea(
            @Parameter(description = "物业公司ID", required = true)
            @PathVariable Long propertyCompanyId) {
        log.info("获取物业公司总服务面积，物业公司ID：{}", propertyCompanyId);
        
        try {
            Result<BigDecimal> result = propertyCompanyStatisticsService.getTotalServiceArea(propertyCompanyId);
            
            if (result.isSuccess()) {
                log.info("获取物业公司{}总服务面积成功：{}平方米", propertyCompanyId, result.getData());
            } else {
                log.warn("获取物业公司{}总服务面积失败：{}", propertyCompanyId, result.getMessage());
            }
            
            return result;
        } catch (Exception e) {
            log.error("获取物业公司{}总服务面积异常", propertyCompanyId, e);
            return Result.fail("获取总服务面积失败：" + e.getMessage());
        }
    }

    /**
     * 获取物业公司服务社区数量
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 服务社区数量
     */
    @GetMapping("/community-count/{propertyCompanyId}")
    @Operation(summary = "获取物业公司服务社区数量", description = "根据物业公司ID获取服务社区数量")
    public Result<Long> getServiceCommunityCount(
            @Parameter(description = "物业公司ID", required = true)
            @PathVariable Long propertyCompanyId) {
        log.info("获取物业公司服务社区数量，物业公司ID：{}", propertyCompanyId);
        
        try {
            Result<Long> result = propertyCompanyStatisticsService.getServiceCommunityCount(propertyCompanyId);
            
            if (result.isSuccess()) {
                log.info("获取物业公司{}服务社区数量成功：{}", propertyCompanyId, result.getData());
            } else {
                log.warn("获取物业公司{}服务社区数量失败：{}", propertyCompanyId, result.getMessage());
            }
            
            return result;
        } catch (Exception e) {
            log.error("获取物业公司{}服务社区数量异常", propertyCompanyId, e);
            return Result.fail("获取服务社区数量失败：" + e.getMessage());
        }
    }

    /**
     * 获取物业公司服务户数
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 服务户数
     */
    @GetMapping("/household-count/{propertyCompanyId}")
    @Operation(summary = "获取物业公司服务户数", description = "根据物业公司ID获取服务户数")
    public Result<Long> getServiceHouseholdCount(
            @Parameter(description = "物业公司ID", required = true)
            @PathVariable Long propertyCompanyId) {
        log.info("获取物业公司服务户数，物业公司ID：{}", propertyCompanyId);
        
        try {
            Result<Long> result = propertyCompanyStatisticsService.getServiceHouseholdCount(propertyCompanyId);
            
            if (result.isSuccess()) {
                log.info("获取物业公司{}服务户数成功：{}", propertyCompanyId, result.getData());
            } else {
                log.warn("获取物业公司{}服务户数失败：{}", propertyCompanyId, result.getMessage());
            }
            
            return result;
        } catch (Exception e) {
            log.error("获取物业公司{}服务户数异常", propertyCompanyId, e);
            return Result.fail("获取服务户数失败：" + e.getMessage());
        }
    }

    /**
     * 获取物业公司综合统计信息
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 综合统计信息
     */
    @GetMapping("/comprehensive/{propertyCompanyId}")
    @Operation(summary = "获取物业公司综合统计信息", description = "根据物业公司ID获取所有统计数据的聚合信息")
    public Result<Map<String, Object>> getComprehensiveStatistics(
            @Parameter(description = "物业公司ID", required = true)
            @PathVariable Long propertyCompanyId) {
        log.info("获取物业公司综合统计信息，物业公司ID：{}", propertyCompanyId);
        
        try {
            Result<Map<String, Object>> result = propertyCompanyStatisticsService.getComprehensiveStatistics(propertyCompanyId);
            
            if (result.isSuccess()) {
                log.info("获取物业公司{}综合统计信息成功", propertyCompanyId);
            } else {
                log.warn("获取物业公司{}综合统计信息失败：{}", propertyCompanyId, result.getMessage());
            }
            
            return result;
        } catch (Exception e) {
            log.error("获取物业公司{}综合统计信息异常", propertyCompanyId, e);
            return Result.fail("获取综合统计信息失败：" + e.getMessage());
        }
    }

    /**
     * 刷新物业公司统计缓存
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 是否成功
     */
    @PostMapping("/refresh-cache/{propertyCompanyId}")
    @Operation(summary = "刷新物业公司统计缓存", description = "根据物业公司ID刷新相关统计缓存")
    @ApiLog(
        logTitle = "刷新物业公司统计缓存",
        logType = 2,
        moduleName = "物业管理",
        operationType = ApiLogOperationType.UPDATE
    )
    public Result<Boolean> refreshStatisticsCache(
            @Parameter(description = "物业公司ID", required = true)
            @PathVariable Long propertyCompanyId) {
        log.info("刷新物业公司统计缓存，物业公司ID：{}", propertyCompanyId);
        
        try {
            Result<Boolean> result = propertyCompanyStatisticsService.refreshStatisticsCache(propertyCompanyId);
            
            if (result.isSuccess()) {
                log.info("刷新物业公司{}统计缓存成功", propertyCompanyId);
            } else {
                log.warn("刷新物业公司{}统计缓存失败：{}", propertyCompanyId, result.getMessage());
            }
            
            return result;
        } catch (Exception e) {
            log.error("刷新物业公司{}统计缓存异常", propertyCompanyId, e);
            return Result.fail("刷新统计缓存失败：" + e.getMessage());
        }
    }

    /**
     * 获取当前用户物业公司综合统计信息
     * 
     * @return 综合统计信息
     */
    @GetMapping("/current-user/comprehensive")
    @Operation(summary = "获取当前用户物业公司综合统计信息", description = "获取当前登录用户关联物业公司的综合统计信息")
    public Result<Map<String, Object>> getCurrentUserComprehensiveStatistics() {
        try {
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                log.warn("获取当前用户ID失败，用户未登录");
                return Result.fail("用户未登录，请先登录");
            }
            
            log.info("获取当前用户{}的物业公司综合统计信息", currentUserId);
            
            // 获取用户关联的物业公司ID列表
            List<Long> propertyCompanyIds = dataScopeService.getUserPropertyCompanyIds(currentUserId);
            if (propertyCompanyIds == null || propertyCompanyIds.isEmpty()) {
                log.warn("用户{}未关联任何物业公司", currentUserId);
                return Result.fail("您未关联任何物业公司，无法获取统计信息");
            }
            
            // 如果用户关联多个物业公司，返回第一个的统计信息
            Long propertyCompanyId = propertyCompanyIds.get(0);
            log.info("用户{}关联物业公司{}，获取综合统计信息", currentUserId, propertyCompanyId);
            
            Result<Map<String, Object>> result = propertyCompanyStatisticsService.getComprehensiveStatistics(propertyCompanyId);
            return result;
            
        } catch (Exception e) {
            log.error("获取当前用户物业公司综合统计信息异常", e);
            return Result.fail("获取统计信息失败：" + e.getMessage());
        }
    }
    
    /**
     * 获取物业公司仪表盘统计数据
     * 生产环境高标准：使用综合统计接口，一次调用获取所有数据，提高性能
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 仪表盘统计数据
     */
    @GetMapping("/dashboard/{propertyCompanyId}")
    @Operation(summary = "获取物业公司仪表盘统计数据", description = "获取物业公司仪表盘所需的所有统计数据，包括总服务面积、服务社区、服务户数等")
    public Result<Map<String, Object>> getDashboardStatistics(
            @Parameter(description = "物业公司ID", required = true)
            @PathVariable Long propertyCompanyId) {
        log.info("获取物业公司{}仪表盘统计数据", propertyCompanyId);
        
        try {
            // 生产环境高标准：使用综合统计接口，一次调用获取所有数据
            // 避免分别调用三个接口，提高性能和用户体验
            Result<Map<String, Object>> result = propertyCompanyStatisticsService.getComprehensiveStatistics(propertyCompanyId);
            
            if (result.isSuccess()) {
                Map<String, Object> data = result.getData();
                log.info("获取物业公司{}仪表盘统计数据成功：总服务面积={}m²，服务社区={}，服务户数={}", 
                    propertyCompanyId, 
                    data.get("totalServiceArea"), 
                    data.get("serviceCommunityCount"), 
                    data.get("serviceHouseholdCount"));
            } else {
                log.warn("获取物业公司{}仪表盘统计数据失败：{}", propertyCompanyId, result.getMessage());
            }
            
            return result;
        } catch (Exception e) {
            log.error("获取物业公司{}仪表盘统计数据异常", propertyCompanyId, e);
            return Result.fail("获取仪表盘统计数据失败：" + e.getMessage());
        }
    }
    
    /**
     * 获取当前用户物业公司仪表盘统计数据
     * 生产环境高标准：自动获取用户关联的物业公司，使用综合统计接口
     * 
     * @return 仪表盘统计数据
     */
    @GetMapping("/dashboard/current-user")
    @Operation(summary = "获取当前用户物业公司仪表盘统计数据", description = "自动获取当前登录用户关联物业公司的仪表盘统计数据")
    public Result<Map<String, Object>> getCurrentUserDashboardStatistics() {
        try {
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                log.warn("获取当前用户ID失败，用户未登录");
                return Result.fail("用户未登录，请先登录");
            }
            
            log.info("获取当前用户{}的物业公司仪表盘统计数据", currentUserId);
            
            // 获取用户关联的物业公司ID列表
            List<Long> propertyCompanyIds = dataScopeService.getUserPropertyCompanyIds(currentUserId);
            if (propertyCompanyIds == null || propertyCompanyIds.isEmpty()) {
                log.warn("用户{}未关联任何物业公司", currentUserId);
                return Result.fail("您未关联任何物业公司，无法获取统计信息");
            }
            
            // 如果用户关联多个物业公司，返回第一个的仪表盘统计数据
            Long propertyCompanyId = propertyCompanyIds.get(0);
            log.info("用户{}关联物业公司{}，获取仪表盘统计数据", currentUserId, propertyCompanyId);
            
            Result<Map<String, Object>> result = propertyCompanyStatisticsService.getComprehensiveStatistics(propertyCompanyId);
            return result;
            
        } catch (Exception e) {
            log.error("获取当前用户物业公司仪表盘统计数据异常", e);
            return Result.fail("获取仪表盘统计数据失败：" + e.getMessage());
        }
    }
}
